www.gusucode.com > 一个ajax功能的JS xml读取封装类代码源码程序 > 一个ajax功能的JS xml读取封装类代码/xml/xml/readXML.js

    var xmlFile="menuConfig.xml";

//新建XML文档对象
function createXMLDom(){
	if (window.ActiveXObject){
		//在IE下使用ActiveX来创建
		var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
	}else{ 
		//在其他浏览器上,例如Firefox,使用document.implementation.createDocument来创建
		if (document.implementation&&document.implementation.createDocument)
			var xmldoc=document.implementation.createDocument("","doc",null);
	}
	//异步读取XML文件
	xmldoc.async = false;
	//为了兼容FireFox等浏览器,preserveWhiteSpace设置为true,不过我们会在后面的程序中进行处理;
	xmldoc.preserveWhiteSpace=true;
	//返回xml文档对象
	return xmldoc;
}

//创建XMLHttp对象,这是以备XML文档对象无法创建时用来读取XML对象的
function createXMLHttp(){
	var xmlHttp;
	if (window.ActiveXObject){
		//IE下用Activex来创建
		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		//Firefox已经内置对xmlhttp的支持
		xmlHttp=new XMLHttpRequest();
	}
	//返回xmlhttp对象
	return xmlHttp;
}

//加载XML文件。
var xmlDom=createXMLDom();
try{
	//直接装载XML文件
	xmlDom.load(xmlFile);
}catch(e){
	//如果失败就使用xmlhttp方式返回responseXML方式来装载
	var xmlHttp=createXMLHttp();
	xmlHttp.onreadystatechange = function(){
	if(xmlHttp.readyState == 4){
		xmlDom=xmlHttp.responseXML;
	}
}
//使用同步的Get方式获取xml文件
xmlHttp.open("GET",xmlFile,false);
xmlHttp.send(null);
}

var DOMRoot=xmlDom.documentElement;

//为根节点增加一个Menu_ID属性,并赋值为Menu
newAttribute(DOMRoot,"Menu_ID","Menu");
//从根节点开始遍历整个XML
switchTree(DOMRoot,0)
//取得一级菜单的数目
NoOffFirstLineMenus=getChildCount(DOMRoot);

//遍历XML中的所有节点
function switchTree(pNode,pLevel){
	var tNode,i,x;
	x=1;
	for(i=0;tNode=pNode.childNodes[i];i++){
		if(tNode.nodeType==3) continue;//因为preserveWhiteSpace等于true,所以要把空行的childNode过滤掉
		var c=getChildCount(tNode);
		if (pLevel==0)
		{//一级菜单的定义为Menu1,Menu2,没有下划线
			newAttribute(tNode,"Menu_ID",getDOMAtt(pNode,"Menu_ID")+x);
		}else{//二级以上菜单定义为Menu1_x,每级间用下划线分隔
			newAttribute(tNode,"Menu_ID",getDOMAtt(pNode,"Menu_ID")+"_"+x);
		}
		//document.write(nbsp(pLevel),"("+c+")",getNodeName(tNode),attList(tNode),getNodeValue(tNode),"<br />");
		//alert(getDOMAtt(tNode,"Menu_ID")+'=new Array("'+getDOMAtt(tNode,"name")+'","'+getDOMAtt(tNode,"link")+'","'+getDOMAtt(tNode,"background")+'",'+c+','+getDOMAtt(tNode,"height")+','+getDOMAtt(tNode,"width")+');');
		eval(getDOMAtt(tNode,"Menu_ID")+'=new Array("'+getDOMAtt(tNode,"name")+'","'+getDOMAtt(tNode,"link")+'","'+getDOMAtt(tNode,"background")+'",'+c+','+getDOMAtt(tNode,"height")+','+getDOMAtt(tNode,"width")+');');
		x++;
		switchTree(tNode,pLevel+1);
	}
}


//取出指定节点的属性。
function getDOMAtt(pNode,pAttribute){
	try{
		return pNode.attributes.getNamedItem(pAttribute).nodeValue;
	}catch(e){
		//alert("指定节点不存在,或指定属性:"+pAttribute+" 不存在!")
		return "";
	}
} 

//取得节点的名称tagName
function getNodeName(pNode){
	if(pNode.nodeType == 4) return '';
	return pNode.nodeName;
}

//取得指定节点的所有属性名称和值
function attList(pNode){
	if(pNode.nodeType == 4) return '';
	var oAtt,tmpString="[ ";
	try{
		for(var i=0;oAtt=pNode.attributes[i];i++){
			tmpString+=oAtt.nodeName+" = '" + oAtt.nodeValue+"' ";
		}
		tmpString+=" ]"
		return tmpString;
	}catch(e){
		return "";
	}
}

//取得节点的值
function getNodeValue(pNode){
	try{
		return " : " + pNode.firstChild.nodeValue;
	}catch(e){
		return '';
	}
}

//产生指定数量的空格,用于缩进来表示层级关系
function nbsp(pNum){
	var tmpString="";
	for(var i=0;i<pNum;i++){
		tmpString+="&nbsp;"//这里是html的空格
	}
	return tmpString;
}

//为指定的节点添加一个属性,并赋值
function newAttribute(tNode,attName,attValue){
	var r1 = xmlDom.createAttribute(attName);
	r1.value=attValue;
	//添加属性
	tNode.setAttributeNode(r1);
}

//计算此节点下的子节点数目,其中过滤掉换行等空白节点
function getChildCount(tNode){
	var c=0;
	for (var i=0;i<tNode.childNodes.length ;i++ )
	{
		if(tNode.childNodes[i].nodeType!=3)
		{
			c++;
		}
	}
	return c;
}